第3章 硬件基础知识学习
通过第二章的学习,貌似成功地点亮了一个 LED 小灯,但是有一些知识点还需要深入学习。单片机是根据硬件电路图的设计来编写代码的,所以学习单片机不仅仅要学习编程知识,还要学习基本的硬件知识,本章就来穿插介绍电路硬件知识。
3.1 电磁干扰 EMI
B站在线视频教程:3-1电磁干扰 EMI
首先介绍一下去耦电容的应用背景,这个背景就是电磁干扰,也就是传说中的 EMI(Electromagnetic Interference)。
-
冬天的时候,尤其是空气比较干燥的内陆城市,很多朋友都有这样的经历,手触碰到计算机外壳、铁柜子等物品的时候会被电击,这就是“静电放电”现象,也称之为 ESD。
-
不知道你有没有这样的经历,早期使用电钻这种电机设备,并且同时在看电视的时候,电视会出现杂音,这就是“快速瞬间群脉冲”的效果,也称之为 EFT。
-
以前的老电脑,有的性能不是很好,带电热插拔优盘、移动硬盘等外围设备的时候,内部会产生一个百万分之一秒的电源切换,直接导致电脑出现蓝屏或者重启现象,就是热插拔的“浪涌”效果,称之为 Surge。
……
电磁干扰的内容有很多,这里不能一一列举,但是有些内容非常重要,后边要一点点的了解。这些问题大家不要认为是小问题,比如一个简单的静电放电,用手能感觉到的静电,可能已经达到 3KV 以上了,如果用眼睛能看得到的,至少是 5KV 了,只是因为这个电压虽然很高,能量却非常小,持续的时间非常短,因此不会对人体造成伤害。但是这些半导体元器件就不一样了,一旦瞬间电压过高,就有可能造成器件的损坏。即使不损坏,在 2、3 里边介绍的两种现象,也已经严重干扰到设备的正常使用了。 基于以上的这些问题,就诞生了电磁兼容(EMC)这个名词。这节课讲一下去耦电容的应用,电磁兼容的处理在今后设计电路,对 PCB 画板布局中应用尤为重要。
3.2 去耦电容的应用
首先来看图 3-1,前面已经见过的 USB 接口和供电电路。
右边这张图,在+5IN 处接了一个 22uF 的电容 C16,这个电容值相对开发板上其他的电容比较大,理论上可以理解成水缸或者水池子,同时,可以直接将电流理解成水流,大自然万物的原理都是类似的。
(1)缓冲作用。当上电的瞬间,电流从电源处流下来的时候,容易冲击电子器件,加电容可以起到缓冲作用。就如同直接用水龙头的水浇地,容易冲坏花花草草。只需要在水龙头处加个水池,让水经过水池后再缓慢流进草地,就不会冲坏花草,起到有效的保护作用。
(2)稳定作用。电路中后级诸多电子器件的功率大小都不一样,而器件正常工作的时候,所需电流的大小也不是一成不变的。比如后级有个器件还没有工作的时候,电流消耗是100mA,突然它参与工作了,电流猛的增大到了 150mA,这个时候如果没有一个水缸,电路中的电压(水位)就会直接突然下降,比如 5V 电压突然降低到 3V 了。而系统中有些电子元器件必须高于一定的电压才能正常工作,电压太低就直接不工作了,这个时候水缸就必不可少了。电容会在这个时候把存储在里边的电量释放一下,稳定电压,当然,随后前级的电流会及时把水缸充满的。
有了这个电容,可以说电压和电流就会很稳定了,不会产生大的波动。这种电容常用的有如图 3-2 和图 3-3 所示三种:
其中第一种个头大,占空间大,单位容量价格最便宜,第二种和第三种个头小,占空间小,性能一般也略好于第一种,但是价格也贵不少。当然,除了价格,还有一些特殊参数,在通信要求高的场合也要考虑很多,这里暂且不说。
电容的选取,第一个参数是耐压值的考虑。Kingst51 开发板用的是 5V 系统,电容的耐压值要高于 5V,一般推荐 1.5 倍到 2 倍即可,有些场合稍微再高点也可以。C16 选用的是 25V耐压的。第二个参数是电容容值,这个就需要根据经验来选取了,选取的时候,要看这个电容起作用的整套系统的功率消耗情况,如果系统耗电较大,波动可能比较大,那么容值就要选大一些,反之可以小一些。
刚开始设计电路也是要模仿别人,别人用多大自己也用多大,慢慢积累。比如上边讲电容作用二的时候,电流从 100mA 突然增大到 150mA,其实即使加上这个电容,电压也会轻微波动,比如从 5V 波动到 4.9V,但是只要板子上的器件在电压 4.9V 以上也可以正常工作的话,这点波动是被容许的,如果不加或者加的很小,电压波动比较大,有些器件的工作就会不正常。如果加的太大,占空间并且价格也高,所以电容的选取多参考经验。
在开发板的每一个芯片的 VCC 和 GND 之间,都有一个 0.1uF 的电容,也就是 100nF,它是用来滤除高频信号干扰的,以 CH340N 为例,如图 3-4 的 C4 所示。
初中学过电容的特性——可以通交流隔直流,但是电容的参数对不同频率段信号的作用是不一样的。这个 100nF 的电容,是前辈根据干扰的频率段,根据板子的参数,根据电容本身的参数所总结出来的一个值。也就是说,以后在设计数字电路的时候,在电源处的去耦高频电容,直接用这个 0.1uF 就可以了,不需要再去计算和考量太多。 还有一点,可以仔细观察 Kingst51 开发板,在所有的 IC 器件的 VCC 和 GND 之间的这个 0.1uF 的高频去耦电容,特别在布板的时候,这个 0.1uF 电容要尽可能的靠近 IC,尽量很顺利的与这个 IC 的 VCC 和 GND 连到一起(尽量不通过过孔连接),确保抗干扰的效果。
3.3 三极管在数字电路中的应用
B站在线视频教程:3-2三极管的应用
三极管在数字电路和模拟电路中都有大量的应用,在 Kingst51 开发板上也用了多个三极管。在板子上的 LED 小灯部分,就有这个三极管的应用了,图 3-5 的 LED 电路中的 Q16 就是一个 PNP 型的三极管。
3.3.1 三极管的初步认识
三极管是一种常用的控制和驱动器件,常用的三极管根据材料分有硅管和锗管两种,原理相同,压降略有不同,硅管用的较普遍,而锗管应用较少,本书采用硅管的参数来进行讲解。三极管有 2 种类型,分别是 PNP 型和 NPN 型,如图 3-6 所示。
三极管一共有 3 个极,从图 3-6 来看,横向左侧的引脚叫做基极(base),中间有一个箭头,一头连接基极,另外一头连接的是发射极 e(emitter),剩下的一个引脚就是集电极 c(collector)了。这是必须要记住的内容,死记硬背即可。
3.3.2 三极管的原理
三极管有截止、放大、饱和三种工作状态。放大状态主要应用于模拟电路中,且用法和计算方法也比较复杂暂时用不到。而数字电路主要使用的是三极管的开关特性,只用到了截止与饱和两种状态,所以重点讲这两种用法。三极管的类型和用法作者给大家总结了一句口诀:箭头朝内 PNP,导通电压顺箭头过,电压导通,电流控制。解析一下这个口诀。如图 3-6 所示,三极管有 2 种类型,箭头朝内就是 PNP,那箭头朝外的自然就是 NPN 了,在实际应用中,要根据实际电路的需求来选择到底用哪种类型。三极管的用法特点,关键点在于 b 极(基极)和 e 级(发射极)之间的电压情况,对于PNP 而言,e 极电压只要高于 b 级 0.7V 以上,这个三极管 e 级和 c 级之间就可以顺利导通。也就是说,控制端在 b 和 e 之间,被控制端是 e 和 c 之间。同理,NPN 型三极管的导通电压是 b 极比 e 极高 0.7V,总之是箭头的始端比末端高 0.7V 就可以让三极管的 e 极和 c 极导通。这就是关于“导通电压顺箭头过,电压导通”的解释。
以图 3-7 为例,三极管基极通过一个 10kΩ的电阻接到了单片机的一个 I/O 口上,假定是P1.0,发射极接到 5V 的电源上,集电极接了一个 LED 小灯,并且串联了一个 1K 的限流电阻最终接到了电源负极 GND 上。如果 P1.0 由程序给一个高电平 1,那么基极 b 和发射极 e 都是 5V,也就是说 e 到 b 不会产生一个 0.7V 的压降,这个时候,发射极和集电极也就不会导通,那么竖着看这个电路在三极管处是断开的,没有电流通过,LED2 小灯也就不会亮。如果程序给 P1.0 一个低电平 0,这时 e 极还是 5V,于是 e 和 b 之间产生了压差,三极管 e 和 b 之间也就导通了,三极管 e 和b 之间大概有 0.7V 的压降,那还有(5-0.7)V 的电压会在电阻 R47 上。这个时候,e 和 c 之间也会导通了,那么 LED 小灯本身有 2V 的压降,三极管本身 e 和 c 之间大概有 0.2V 的压降,忽略不计。在 R41 上就会有大概 3V 的压降,可以计算出来,这条支路的电流大概是 3mA,可以成功点亮 LED。
电流控制是什么意思呢?前边讲过,三极管有截止、放大以及饱和三个状态。截止,就是 e 和 b 之间不导通。而要让这个三极管处于饱和状态,就是所谓的开关特性,必须要满足一个条件。三极管都有一个放大倍数β,要想处于饱和状态,b 极电流就必须大于 e 和 c 之间电流值除以β。这个β,对于常用的三极管大概可以认为是 100。那么图 3-7 中的 R47 的阻值必须要来计算一下了。刚才算过了,e 和 c 之间的电流是 3mA,那么 b 极电流最小就是 3mA 除以 100 等于 30uA,大概有 4.3V 电压会落在基极电阻上,基极电阻最大值就是 4.3V/30uA = 143K。电阻值只要比这个值小就可以,当然也不能太小,太小会导致单片机的 I/O 口电流过大烧坏三极管或者单片机,STC89C52 的 I/O 口输入电流最大理论值是 25mA,推荐不要超过 6mA,用电压和电流算一下,就可以算出来最小电阻值,图 3-7 取的是经验值。
3.3.3 三极管的应用
三极管在数字电路里的开关特性,最常见的应用有 2 个:一个是控制应用,一个是驱动应用。所谓的控制就是如图 3-7 里边介绍的,可以通过单片机控制三极管的基极来间接控制后边的小灯的亮灭。还有一个控制就是进行不同电压之间的转换控制,比如 Kingst51 单片机是 5V 系统,现在要跟一个 12V 的系统对接,如果 I/O 直接接 12V 电压就会烧坏单片机,所以加一个三极管,三极管的工作电压高于单片机的 I/O 口电压,用 5V 的 I/O 口来控制 12V的电路,如图 3-8 所示。
图 3-8 中,当 I/O 口输出高电平 5V 时,三极管导通,OUT 输出低电平 0V,当 I/O 口输出低电平时,三极管截止,OUT 则由于上拉电阻 R2 的作用而输出 12V 的高电平,这样就实现了低电压控制高电压的工作原理。所谓的驱动,主要是指电流输出能力。如图 3-9 中两个电路之间的对比。
图 3-9 中上边的的 LED 灯,和第二课讲过的 LED 灯是一样的,当 I/O 口是高电平时,小灯熄灭,当 I/O 口是低电平时,小灯点亮。那么下边的电路呢,按照这种推理,I/O 口是高电平的时候,应该有电流流过并且点亮小灯,但实际上却并非这么简单。单片机主要是个控制器件,具备四两拨千斤的特点。就如同杠杆必须有一个支点一样,想要撑起整个地球必须有力量承受的支点。单片机的 I/O 口可以输出一个高电平,但是它的输出电流却很有限,普通 I/O 口输出高电平的时候,大概只有几十到几百 uA 的电流,达不到 1mA,也就点不亮这个 LED 小灯或者是亮度很低,这个时候如果想用高电平点亮 LED, 就可以用上三极管来处理了,板上的这种三极管型号,可以通过 500mA 的电流,有的三极管通过的电流还更大一些,如图 3-10 所示。
图 3-10 中,当 I/O 口是高电平,三极管导通,因为三极管的电流放大作用,c 极电流就可以达到 mA 以上了,就可以成功点亮 LED 小灯。
3.4 74HC138 三八译码器的应用
B站在线视频教程:3-3 三八译码器的应用
在设计单片机电路的时候,单片机的 I/O 口数量是有限的,有时满足不了产品需求,比如 STC89C52 一共有 32 个 I/O 口,但是为了控制更多的器件,就可以使用一些外围的数字芯片,这类数字芯片由简单的输入逻辑来控制输出逻辑,比如 74HC138 这个三八译码器,图3-11 是 74HC138 在 Kingst51 开发板上的一个应用。
从名字来分析,三八译码器就是把 3 种输入状态翻译成 8 种输出状态。从图 3-11 能看出,74HC138 的 1~6 一共是 6 个输入引脚,但是其中 4、5、6 这三个引脚是使能引脚。这三个引脚如果不符合芯片规定的输入要求,不管输入的 1、2、3 引脚是什么电平状态,7 到 15 引脚总是输出高电平。所以根据器件使用手册说明,要想让 74HC138 正常工作,ENLED 接的4 脚和 5 脚必须输入低电平,ADDR3 接的 6 脚必须输入高电平,这两个位置都是使能控制端口。不知道是否记得前边点亮 LED 程序有这么两条控制 74HC138 使能的语句:ENLED = 0;ADDR3 = 1;这类逻辑芯片,大多都是有使能引脚的,使能符合要求的前提下,就可以研究控制逻辑了。对于数字器件的引脚,如果一个引脚输入的时候,有 0 和 1 两种状态;对于两个引脚输入的时候,就会有 00、01、10、11 这四种状态了,那么对于 3 个输入的时候,就会出现 8种状态了,大家可以看下边的这个真值表——图 3-12,其中输入是 A2、A1、A0 的顺序,输出是从 Y7、Y6……Y0 的顺序。
从图 3-12 可以看出,任一输入状态下,只有一个输出引脚是低电平,其他的引脚都是高电平。在前面的电路中已经看到,8 个 LED 小灯的总开关三极管 Q16 基极的控制端是 LEDS6,也就是 Y6 输出一个低电平的时候,可以开通三极管 Q16,从右侧的希望 LEDS5 输出低电平这样的结果,可以推导出左侧输入端 A2、A1、A0 的输入状态应该是 110,如图 3-13。
那么再整体捋一遍点亮 LED 小灯的过程,首先看 74HC138,要让 LEDS6 为低电平才能导通三极管 Q16,所以ENLED = 0;ADDR3 = 1;保证 74HC138 使能。ADDR2 = 1; ADDR1 = 1; ADDR0 = 0;保证了三极管 Q16 这个开关开通,5V 电源加到 LED 上。通过 P0 口控制,让 P0.0 引脚等于 0,就是 DB0 等于 0,那么这样在这一排共 8 个 LED小灯当中,只有最右侧的小灯和 5V 之间有压差,有压差就会有电流通过,LED2 就会发光了。 从原理图左上角 P0 口总线可以看出,74HC138 的 ADDR0 、ADDR1、ADDR2、 ADDR3和 ENLED 接在 P1.0 到 P1.3 引脚上,如图 3-14 所示。
3.5 LED 闪烁程序
B站在线视频教程:3-4 LED 闪烁程序
点亮 LED 小灯的程序就是 LED = 0。熄灭小灯的程序是 LED = 1。点亮和熄灭都会了,那么如果在亮和灭中间加个延时,反复不停的点亮和熄灭小灯,就成了闪烁了。首先复习一下 Keil 写程序的过程,建立工程-->保存工程-->建立文件-->添加文件到工程-->编写程序-->编译-->下载程序。LED 闪烁程序如下所示。
#include<reg52.h>
sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main(void) //void 即为函数类型
{
//以下为声明语句部分
unsigned int i = 0; //定义一个无符号整型变量,并赋初值 i=0
//以下为执行语句部分
ENLED = 0; //U3\U4两片74HC138总使能
ADDR3 = 1; //使能U3使之正常输出
ADDR2 = 1; //经U3的Y6输出开启三极管Q16
ADDR1 = 1; //
ADDR0 = 0; //
while (1)
{
LED = 0; //点亮小灯
for (i=0; i<30000; i++); //延时一段时间
LED = 1; //熄灭小灯
for (i=0; i<30000; i++); //延时一段时间
}
}
把这个程序编译一下,下载到单片机里,就会发现 LED2 这个小灯会闪烁了。
3.6 练习题
1、深刻理解电容的意义,并且在今后的学习电路过程中要多多注意并且参考别人电路中所用到的去耦电路,积累经验。
2、完全背过三极管的导通原理,并且可以熟练掌握 NPN 和 PNP 这两种三极管在开关特性下的应用方法。
3、学习并且掌握 74HC138 的应用原理,能够在设计电路中正确应用。
4、能够独立实现点亮开发板上的每一个小灯,并且可以实现小灯点亮和灭以及闪烁功能。